//
// Created by XML on 2024/1/9.
//  字符串截取
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


/**
 * 第一版：通用
 * @param result
 * @param str
 * @param start
 * @param end
 */
void substr1(char *result,char *str,int start,int end){
    char *temp = str; // 定义临时指针，不破坏str指针
    int count = 0;
    while (*temp){
        if(count>=start && count < end){
            *result = *temp;
            result++;  //（接收值也要挪动）挪动指针来接收
        }
        temp++; //指针挪动
        count++;

    }

}

/**
 * 第二版：一级指针和堆栈区内存管理
 * @param result
 * @param str
 * @param start
 * @param end
 */
void substr2(char **result,char *str,int start,int end){
    char *temp = str;
    // 用数组开辟内存空间，需要多少就开辟多少
//    char resultArr[end-start];

// 开辟一个堆内存 ,需要手动回收内存
    char *resultArr = malloc(end-start);

    // 从start下标开始遍历，end为结束点
    int count=0;
    for (int i = start; i < end; ++i) {
        //  temp默认是指针0的位置，(temp+i)取出值放在数组中
        resultArr[count] = *(temp+i);
        count++;
    }
    // 如果是数组定义在栈区，就不能让我们的一级指针 指向容器，因为函数栈执行完后，容器会被回收掉
    // 如果是保存到堆区，不会因为函数栈出栈而回收
    *result = resultArr;
//    strcpy_s(*result,50,resultArr);


    printf("sub：%s\n",  *result);


}

//void substr3(char *result, char *str, int start, int end) {
//    // 合理分配，截取多少用多少，节约 思路
//    for (int i = start; i < end; ++i) {
//        *(result++) = *(str + i);
//    }
//}

void substr4(char *result,char *str,int start,int end){
    strncpy_s(result, sizeof(result),str, end - start);
//    result[sizeof(result)] = '\0';  // 确保字符串以空字符终止
}


int main(){
    char *str = "hello world";
    char *result = NULL;
//    substr1(result,str,0,5);
    // &result 二级指针
//    substr2(&result,str,0,5);
//    substr3(result,str,0,5);
//    substr4(result,str,0,5);


    printf("截取的内容是：%s\n",result);

    // 回收内存
    if(result){
        free(result);
        result = NULL;
    }

    return 0;
}